﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Itegracion.Framework.Forms
{
    public partial class fmMantenimiento : fmProceso
    {
        protected bool tieneDetalle = false;

        public fmMantenimiento()
        {
            InitializeComponent();
        }

        protected ucEdicion propiedades;
        private void fmMantenimiento_Load(object sender, EventArgs e)
        {
            propiedades = new ucEdicion();
            paEdicion.Dock = DockStyle.Fill;
            paListado.Dock = DockStyle.Fill;
            Modo = ModoMantenimiento.Listado;
            if (Process.GetCurrentProcess().ProcessName != "devenv") //#Hack: Problema de visualizacion en Tipo de Diseño
            {
                OnAddFields(dgvListado, ref propiedades);
                dgvListado.AutoGenerateColumns = false;
                OnLoadData(dgvListado);
            }
            paEdicion.Controls.Add(propiedades);
            propiedades.Dock = DockStyle.Fill;
        }

        protected virtual void OnAddFields(DataGridView listado, ref ucEdicion propiedades)
        {
            MessageBox.Show("Mantenimiento: OnAddFields()");
        }

        protected virtual void OnLoadData(DataGridView listado)
        {
            MessageBox.Show("Mantenimiento: OnLoadData()");
        }
        protected virtual void OnEdit(string id, DataGridViewCell cell, ucEdicion propiedades)
        {
            MessageBox.Show(string.Format("Mantenimiento: OnEdit({0}, {1})", id, cell));
        }
        protected virtual void OnNew(ucEdicion propiedades)
        {
            MessageBox.Show(string.Format("Mantenimiento: OnNew({0})", propiedades));
        }

        protected virtual bool AreDataValid(ModoMantenimiento modo, ucEdicion propiedades)
        {
            MessageBox.Show(string.Format("Mantenimiento: bool AreDataValid(ModoMantenimiento modo, ucEdicion propiedades)"));
            return true;
        }
        protected virtual void OnSave(object id, ModoMantenimiento modo, ucEdicion propiedades)
        {
            MessageBox.Show(string.Format("Mantenimiento: OnSave(object id, ModoMantenimiento modo, ucEdicion propiedades)"));
        }
        protected virtual bool OnDelete(string id, DataGridViewCell cell)
        {
            MessageBox.Show(string.Format("Mantenimiento: OnDelete({0}, DataGridViewCell cell)", id));
            return false;
        }
        protected virtual void OnAddItem()
        {
            MessageBox.Show(string.Format("Mantenimiento: OnAddItem()"));
        }
        protected virtual void OnRemoveItem()
        {
            MessageBox.Show(string.Format("Mantenimiento: OnRemoveItem()"));
        }

        private ModoMantenimiento modo;
        public ModoMantenimiento Modo { 
            get{
                return modo;
            }
            set{
                modo = value;
                if (modo == ModoMantenimiento.Listado)
                {
                    paEdicion.Visible = false;
                    paListado.Visible = true;
                    tsbNuevo.Enabled = true;
                    tsbEliminar.Enabled = true;
                    tsbGuardar.Enabled = false;
                    tsbGuardarContinuar.Enabled = false;
                    tsbCancelar.Enabled = false;
                    slBuscar.Enabled = true;
                    stbClave.Enabled = true;
                    tssDetalle.Visible = false;
                    tsbAgregar.Visible = false;
                    tsbQuitar.Visible = false;
                }
                if (modo == ModoMantenimiento.Edicion)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbNuevo.Enabled = true;
                    tsbEliminar.Enabled = true;
                    tsbGuardar.Enabled = true;
                    tsbGuardarContinuar.Enabled = false;
                    tsbCancelar.Enabled = true;
                    slBuscar.Enabled = false;
                    stbClave.Enabled = false;
                    tssDetalle.Visible = tieneDetalle;
                    tsbAgregar.Visible = tieneDetalle;
                    tsbQuitar.Visible = tieneDetalle;
                }
                if (modo == ModoMantenimiento.Nuevo)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbNuevo.Enabled = false;
                    tsbEliminar.Enabled = false;
                    tsbGuardar.Enabled = true;
                    tsbGuardarContinuar.Enabled = true;
                    tsbCancelar.Enabled = true;
                    slBuscar.Enabled = false;
                    stbClave.Enabled = false;
                    tssDetalle.Visible = tieneDetalle;
                    tsbAgregar.Visible = tieneDetalle;
                    tsbQuitar.Visible = tieneDetalle;
                }
            }
        }

        private void tsbNuevo_Click(object sender, EventArgs e)
        {
            propiedades.Clear();
            OnNew(propiedades); 
            Modo = ModoMantenimiento.Nuevo;
        }

        private void tsbCancelar_Click(object sender, EventArgs e)
        {
            Modo = ModoMantenimiento.Listado;
        }

        private void tsbGuardar_Click(object sender, EventArgs e)
        {
            ep.Clear();
            object id = null;
            if (Modo == ModoMantenimiento.Edicion)
                id = dgvListado.SelectedRows[0].Cells[0].Value;  
            
            if (AreDataValid(Modo, propiedades))
            {
                OnSave(id, Modo, propiedades);
                OnLoadData(dgvListado);
                Modo = ModoMantenimiento.Listado;
            }
        }
        private void tsbGuardarContinuar_Click(object sender, EventArgs e)
        {
            ep.Clear();
            object id = null;
            if (Modo == ModoMantenimiento.Edicion)
                id = dgvListado.SelectedRows[0].Cells[0].Value;

            if (AreDataValid(Modo, propiedades))
            {
                OnSave(id, Modo, propiedades);
                OnLoadData(dgvListado);
                propiedades.Clear();
                OnNew(propiedades); 
                Modo = ModoMantenimiento.Nuevo;
            }
        }        

        private void tsbEliminar_Click(object sender, EventArgs e)
        {   
            if (dgvListado.SelectedRows.Count > 0)
            {
                if (MessageBox.Show(this, "Se eliminar el registro seleccionado. \n ¿Desea continuar?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    OnDelete(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0]);
                    OnLoadData(dgvListado);
                    Modo = ModoMantenimiento.Listado;
                }
            }
            else {
                MessageBox.Show(this, "No hay registros seleccionados", "Itegracion", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void tsbAgregar_Click(object sender, EventArgs e)
        {
            OnAddItem();
        }
        private void tsbQuitar_Click(object sender, EventArgs e)
        {
            OnRemoveItem();
        }

        private void stbClave_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                MessageBox.Show("Filtrando");
            }
        }

        private void dgvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvListado.Rows.Count > 0)
            {
                OnEdit(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0], propiedades);
                Modo = ModoMantenimiento.Edicion;
            }

        }

        private void fmMantenimiento_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F2)
            {
                tsbNuevo_Click(sender, e);
            }
            if (e.KeyCode == Keys.F3)
            {
                tsbAgregar_Click(sender, e);
            }
            if (e.KeyCode == Keys.F5)
            {
                tsbGuardar_Click(sender, e);
            }
            if (e.KeyCode == Keys.F6)
            {
                tsbGuardarContinuar_Click(sender, e);
            }
            if (e.KeyCode == Keys.Escape)
            {
                tsbCancelar_Click(sender, e);
            }
            if (e.KeyCode == Keys.Delete)
            {
                tsbQuitar_Click(sender, e);
            }
            if (e.KeyCode == Keys.F12)
            {
                tsbEliminar_Click(sender, e);
            }
        }

        private void dgvListado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                e.SuppressKeyPress = true;
        }

        private void dgvListado_KeyUp(object sender, KeyEventArgs e)
        {   
            if (dgvListado.Rows.Count > 0 && e.KeyCode == Keys.Enter)
            {
                OnEdit(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0], propiedades);
                Modo = ModoMantenimiento.Edicion;
            }
        }
    }
    public enum ModoMantenimiento { 
        Listado, Edicion, Nuevo
    }
}
